#pragma once 

#include <iostream>
#include <signal.h>
#include <functional> 
#include "Sock.hpp"

class HttpServer
{
public:

    typedef std::function<void(int)> func_t; 

private:

    int _listensock ;
    uint16_t _port  ;
    Sock _sock ; 
    func_t _func ;

public: 

    HttpServer(const uint16_t& port , func_t func)
        :_port(port)
        ,_func(func)
    {
        _listensock = _sock.Socket() ;
        _sock.Bind(_listensock, _port);
        _sock.Listen(_listensock);
    }

    void Start()
    {
        //当一个子进程终止或停止时，父进程会收到SIGCHLD信号。
        signal(SIGCHLD, SIG_IGN);
        for(; ; )
        {
            std::string clientIp; 
            uint16_t clientPort ; 
            int sockfd = _sock.Accept(_listensock, &clientIp, &clientPort);  // 提示 Bad file descriptor ，_listensock失效？？
            if(sockfd < 0)
            {
                continue; 
            }

            if(fork() == 0)
            {
                close(_listensock);
                _func(sockfd); // _func函数执行
                close(sockfd);
                exit(0);
            }
            close(sockfd); 
        }
    }

    ~HttpServer()
    {
        if(_listensock >= 0)
        {
            close(_listensock);
        }
    }

    //关闭文件描述符会触发写时拷贝吗 ？  // 会 


};






